const { Controller } = require("egg");
const axios = require("axios");

class SendMsgService extends Controller {
  /**
   * 发送文本消息给指定微信用户
   *
   * @param {string} wxid - 接收消息的微信用户的ID
   * @param {string} msg - 要发送的文本消息内容
   * @return {Object} - 包含操作结果的对象
   * @return {boolean} returns.success - 操作是否成功
   * @return {string} returns.message - 操作结果信息
   */
  async sendText2(wxid, msg, mywxid) {
    const { ctx } = this;
    // 检查msg是否包含了价格信息，如果包含则进行处理
    // if (!/\d{3,}/.test(msg)) {
    //   ctx.logger.info("消息不包含3位以上连续数字，不处理");
    //   return false;
    // }
    try {
      // 调用外部接口获取当前登录微信用户信息
      const response = await axios.post(
        this.config.baseURL,
        {
          type: "sendText2",
          data: {
            wxid,
            msg,
          },
        },
        {
          params: { wxid: mywxid }, // 将 wxid 作为 Params 参数传递
        }
      );

      // 检查响应状态
      return response.data;
    } catch (error) {
      // 捕获异常并返回错误信息
      this.logger.error("发送消息失败:", error.message);
      return {
        success: false,
        message: "请求失败，请检查网络或接口状态",
      };
    }
  }

  // 发送图片
  async sendImage(wxid, imgPath, mywxid) {
    try {
      // 调用外部接口获取当前登录微信用户信息
      const response = await axios.post(
        this.config.baseURL,
        {
          type: "sendImage",
          data: {
            wxid,
            path: imgPath, // 图片路径
            fileName: "", //当path是网络直链时
          },
        },
        {
          params: { wxid: mywxid }, // 将 wxid 作为 Params 参数传递
        }
      );

      // 检查响应状态
      return response.data;
    } catch (error) {
      // 捕获异常并返回错误信息
      this.logger.error("发送消息失败:", error.message);
      return {
        success: false,
        message: "请求失败，请检查网络或接口状态",
      };
    }
  }

  // 发送文件
  async sendFile(wxid, filePath, mywxid) {
    try {
      // 调用外部接口获取当前登录微信用户信息
      const response = await axios.post(
        this.config.baseURL,
        {
          type: "sendFile",
          data: {
            wxid,
            path: filePath, // 图片路径
            fileName: "", //当path是网络直链时
          },
        },
        {
          params: { wxid: mywxid }, // 将 wxid 作为 Params 参数传递
        }
      );

      // 检查响应状态
      return response.data;
    } catch (error) {
      // 捕获异常并返回错误信息
      this.logger.error("发送消息失败:", error.message);
      return {
        success: false,
        message: "请求失败，请检查网络或接口状态",
      };
    }
  }

  // 分享链接
  async sendShareUrl(wxid, shareUrl, mywxid) {
    try {
      // 调用外部接口获取当前登录微信用户信息
      const response = await axios.post(
        this.config.baseURL,
        {
          type: "sendShareUrl",
          data: {
            wxid,
            title: "分享链接",
            content: "这是一个分享链接",
            jumpUrl: shareUrl, //点击跳转地址
            appId: "",
            path: filePath, //本地路径或者网络直链
          },
        },
        {
          params: { wxid: mywxid }, // 将 wxid 作为 Params 参数传递
        }
      );

      // 检查响应状态
      return response.data;
    } catch (error) {
      // 捕获异常并返回错误信息
      this.logger.error("发送消息失败:", error.message);
      return {
        success: false,
        message: "请求失败，请检查网络或接口状态",
      };
    }
  }

  // 分享小程序
  async sendApplet(wxid, gh, mywxid) {
    try {
      // 调用外部接口获取当前登录微信用户信息
      const response = await axios.post(
        this.config.baseURL,
        {
          type: "sendApplet",
          data: {
            wxid,
            title: "分享链接",
            content: "这是一个分享链接",
            jumpUrl: "pages/index/index.html", //点击跳转地址
            gh: gh,
            path: filePath, //本地路径或者网络直链
          },
        },
        {
          params: { wxid: mywxid }, // 将 wxid 作为 Params 参数传递
        }
      );

      // 检查响应状态
      return response.data;
    } catch (error) {
      // 捕获异常并返回错误信息
      this.logger.error("发送消息失败:", error.message);
      return {
        success: false,
        message: "请求失败，请检查网络或接口状态",
      };
    }
  }

  /**
   * 转发群消息到指定群聊
   * @returns {Promise<string>} 返回发送结果
   */
  //
  async zhuanSend() {
    const { ctx, service } = this;
    const formatDate = (date) => {
      const d = new Date(date);
      const yyyy = d.getFullYear();
      const mm = String(d.getMonth() + 1).padStart(2, "0");
      const dd = String(d.getDate()).padStart(2, "0");
      const hh = String(d.getHours()).padStart(2, "0");
      const min = String(d.getMinutes()).padStart(2, "0");
      const ss = String(d.getSeconds()).padStart(2, "0");
      return `${yyyy}-${mm}-${dd}:${hh}:${min}:${ss}`;
    };
    // 转发群信息 到另外一个群聊（员工专用）
    const msg = await ctx.model.Chatmsg.findOne({ issend: false })
      .sort({
        createTime: -1,
      })
      .lean();
    if (!msg) {
      return "没有需要发送的消息";
    }
    const text2 = await service.message.maskPhoneNumber(msg.message);
    const sendmsg = `${JSON.parse(text2)}\r\n==${formatDate(msg.date)}==`;
    await service.getSelfInfo.sendText2("47668314222@chatroom", sendmsg);
    await ctx.model.Chatmsg.updateOne({ _id: msg._id }, { issend: true });
    await ctx.model.Chatmsg.deleteMany({ isparts: true, issend: true });

    console.log("发送成功");
    return "发送成功";
  }

  /**
   * 发送引用回复消息给指定微信用户
   *
   * @param {string} wxid - 接收消息的微信用户的ID
   * @param {string} msg - 要发送的文本消息内容
   */
  async sendReferText(wxid, msg, msgId, mywxid) {
    try {
      // 调用外部接口获取当前登录微信用户信息
      const response = await axios.post(
        this.config.baseURL,
        {
          type: "sendReferText",
          data: {
            msgId,
            wxid,
            msg,
          },
        },
        {
          params: { wxid: mywxid }, // 将 wxid 作为 Params 参数传递
        }
      );

      // 检查响应状态
      return response.data;
    } catch (error) {
      // 捕获异常并返回错误信息
      this.logger.error("发送消息失败:", error.message);
      return {
        success: false,
        message: "请求失败，请检查网络或接口状态",
      };
    }
  }

  // 保存自发消息记录
  async create(data) {
    const { ctx } = this;
    const getFriendinfo = await ctx.service.getinfo.queryObj(
      data.data.fromWxid,
      data.wxid
    );
    
    if (getFriendinfo.code === 200) {
      const savedata = {
        wxid: data.wxid,
        fromWxid: data.data.fromWxid,
        fromNick: getFriendinfo.result.nick,
        fromWxnum: getFriendinfo.result.wxNum,
        fromSex: getFriendinfo.result.sex,
        msg: data.data.msg,
        signature: data.data.signature,
        msgId: data.data.msgId,
        sendId: data.data.sendId,
        msgtype: data.data.msgType,
        timestamp: data.timestamp,
        date: new Date(Number(data.timestamp) + 8 * 60 * 60 * 1000),
      };

      // console.log("wkd自发消息记录:", savedata);
      try {
        const result = await ctx.model.Sendmsg.create(savedata);
        return result;
      } catch (err) {
        this.ctx.logger.error("保存自发消息失败:", err);
        return null;
      }
    }
  }
}

module.exports = SendMsgService;
